package HereClass;

import java.io.Serializable;
import java.util.ArrayList;



/**
 * Classe que implementa um usuario
 * @author Caio, Ronaldo, Enio e Rafael
 * @version 5.1
 */
public class Usuario implements Serializable, Salvavel,Conectavel{

	
	private static final long serialVersionUID = 1L;
	private String nome;
	private String email;
	private String userName;
	private String senha;
	private String telefone;

	private String ip;
	private String longitude;
	private String latitude;

	private ArrayList<Contato> contatos;

	public Usuario() {

	}

	/**
	 * Cria um Usuario
	 * @param userName
	 * @param nome
	 * @param email
	 * @param senha
	 * @param telefone
	 */
	public Usuario(String userName, String nome, String email, String senha,
			String telefone) {
		this.userName = userName;
		this.nome = nome;
		this.senha = senha;
		this.email = email;
		this.telefone = telefone;
		this.ip = null;
		this.longitude = null;
		this.latitude = null;
		this.contatos = new ArrayList<Contato>();
	}

	public boolean meuAtributo(String atributo) {
		if(this.getUserName().equals(atributo))
			return true;
		if(this.getNome().contains(atributo))
			return true;
		if(this.getEmail().equals(atributo))
			return true;
		
		return false;
	}
	
	public String getUserName() {
		return userName;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getNome() {
		return nome;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public String getSenha() {
		return senha;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getEmail() {
		return email;
	}

	public void setTelefone(String fone) {
		this.telefone = fone;
	}

	public String getTelefone() {
		return telefone;
	}

	public String getIP() {
		return this.ip;
	}

	public void setIP(String ip) {
		this.ip = ip;
	}

	public String getLatitude() {
		return this.latitude;
	}

	public void setLatitude(String latitude) {
		this.latitude = latitude;
	}

	public String getLongitude() {
		return this.longitude;
	}

	public void setLongitude(String longitude) {
		this.longitude = longitude;
	}

	/**
	 * Adiciona um contato no Usuario
	 * @param contato
	 */
	public void addContato(Contato contato) {
		for(int i=0; i<contatos.size(); i++){
			if(contatos.get(i).getNome().compareToIgnoreCase(contato.getNome()) > 1){
				this.contatos.add(i, contato);
				return;
			}
		}
		this.contatos.add(contato);
		
	}
	
	/**
	 * Deleta um contato do Usuario
	 * @param contato
	 * @return true se deletou
	 */
	public boolean deleteContato(Contato contato) {
		return contatos.remove(contato);		
	}

	/**
	 * Retorna lista de amigos
	 * @return uma String
	 */
	public String getListaDeAmigos() {
		String retorno = "[";
		for (int i = 0; i < this.contatos.size(); i++) {
			retorno += this.contatos.get(i).getNome();
			if (i + 1 < this.contatos.size())
				retorno += ", ";
		}
		return retorno + "]";
	}
	
	/**
	 * Retorna contato de um amigo existente
	 * @param amigo
	 * @return um Contato
	 */
	public Contato getContato(String amigo) {
		for (int i = 0; i < contatos.size(); i++)
			if (contatos.get(i).getUserName().equals(amigo))
				return contatos.get(i);
		return null;
	}

	public ArrayList<Contato> getContatos() {
		return contatos;
	}

	public void setContatos(ArrayList<Contato> contatos) {
		this.contatos = contatos;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public boolean equals(Salvavel objSalvavel) {
		Usuario aux = new Usuario();
		if(objSalvavel instanceof Usuario) {
			aux= (Usuario)objSalvavel;
			return this.getUserName().equals(aux.getUserName());
		}
		return false;
	}

	@Override
	public String toCompare() {
		return this.nome;
	}

	@Override
	public int compareTo(Salvavel objSalvavel) {
		return this.toCompare().compareTo(objSalvavel.toCompare());
	}
	
	
}
